package AstParser

import (
	"go/ast"
)

type PParam struct {
   Name string
   Type string
   //IsChan bool //是否是chan
   //IsPtr bool //是否是指针
   //IsArray bool//是否是切片类型
   TypeList [3]bool //类型列表  第一个代表是chan 第二个是ptr(指针) 第三个是array
   IsMap bool //是否是map类型
}
const (
	PARAM_ISCHAN=0
	PARAM_ISPTR=1
	PARAM_ISARRAY=2
)
func(this *PParam) SetChan() {
	this.TypeList[PARAM_ISCHAN]=true
}
func(this *PParam) SetPtr() {
	this.TypeList[PARAM_ISPTR]=true
}
func(this *PParam) SetArray() {
	this.TypeList[PARAM_ISARRAY]=true
}

func(this *PParam) If(t int,str string) string  {
	if this.TypeList[t]{
		return str
	}
	return ""
}
func NewPParam(name string,t ast.Expr) *PParam{
	ret:=&PParam{name,"",[3]bool{false,false,false},false  }
	ast.Walk(ret,t)
	return ret
}
func(this *PParam) filter(exp string) {
	if this.Type!=""{
		//fmt.Println(this.Type)
		this.Type+="."+exp
	}else{
		this.Type =exp
	}
}
//map[string]int
func(this *PParam) Visit(node ast.Node)  ast.Visitor {
	// fmt.Printf("%T\n",node)
	switch exp:=node.(type) {
	case *ast.Ident:  //这一步很重要。各自的类型 经过递归后，大部分都会回归到这个类型
		this.filter(exp.Name) //如引用、map等需要叠加
	case *ast.ArrayType: //切片类型
		this.SetArray()
	case *ast.InterfaceType: //interface类型
		this.filter("interface{}") //如引用、map等需要叠加
	case *ast.MapType://map 类型
		this.IsMap=true
	case *ast.SelectorExpr: //这一步暂时不要
	//	this.Type = fmt.Sprintf("%s.%s", exp.X, exp.Sel)
		break
	case *ast.StarExpr: //指针
		this.SetPtr()
	case *ast.ChanType: //chan类型
		this.SetChan()
	}


	return  this
}
